yaolixing
驱动小牛
驱动小牛
  • 注册日期2006-06-27
  • 最后登录2010-07-15
  • 粉丝1
  • 关注0
  • 积分991分
  • 威望135点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
阅读:4742回复:12

彻底刷新内存映射文件的cache

楼主#
更多 发布于:2007-03-27 22:39
KeEnterCriticalRegion();

                if(ExAcquireResourceExclusiveLite( ((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->Resource, FALSE))
                {
                        
                 if(ExAcquireResourceExclusiveLite( ((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->PagingIoResource, FALSE))
                    {
                  
                        if(FileObject->SectionObjectPointer)
                        {
                           IoSetTopLevelIrp( (PIRP)FSRTL_FSP_TOP_LEVEL_IRP );


                            CcFlushCache( FileObject->SectionObjectPointer, NULL, 0, NULL );
 
                                                                    
                           if(FileObject->SectionObjectPointer->ImageSectionObject)
                           {
                             MmFlushImageSection(
                                                FileObject->SectionObjectPointer,
                                                MmFlushForWrite//MmFlushForDelete//  
                                                ) ;
                           }
                            
                                                  
                           if(FileObject->SectionObjectPointer->DataSectionObject)
                           {  
                              CcPurgeCacheSection( FileObject->SectionObjectPointer,
                                                   NULL,
                                                   0,
                                                   FALSE ); //为TRUE,会强迫所有的FileObject重新初始化Cache                                                                                  
                           }
                          
                           if(FileObject->PrivateCacheMap)
                           {
                              CcUninitializeCacheMap(FileObject, NULL, NULL);;  
                           }
                          

                           if(FileObject->SectionObjectPointer->DataSectionObject)
                           {
                               //Interval.QuadPart = DELAY_ONE_MILLISECOND * 500;//500ms
                               //KeDelayExecutionThread(KernelMode, FALSE, &Interval);
                                                                                  
                               MmForceSectionClosed( FileObject->SectionObjectPointer,
                                                     TRUE//改为TRUE,彻底刷新缓存!!!
                                                    );
                           }                                                        
                           IoSetTopLevelIrp(NULL);                                                  
                        }
                        
                
                        ExReleaseResourceLite( ((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->PagingIoResource );                                
                    }                          
                  ExReleaseResourceLite( ((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->Resource );                                
                }
                              
                KeLeaveCriticalRegion();


但是这样又容易毁坏数据。抛砖引玉,还请高手出手
wengzuhong
驱动小牛
驱动小牛
  • 注册日期2004-07-16
  • 最后登录2014-10-22
  • 粉丝3
  • 关注1
  • 积分9分
  • 威望262点
  • 贡献值0点
  • 好评度219点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-07-03 12:31
yaolixing老大,试过吗???
lauer
驱动牛犊
驱动牛犊
  • 注册日期2004-02-04
  • 最后登录2013-01-07
  • 粉丝1
  • 关注1
  • 积分578分
  • 威望127点
  • 贡献值1点
  • 好评度57点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2007-07-03 17:04
这个我试过,确实有用,不过我的应用中只有读,没有写,所以不存在破坏数据问题
所以这个方法对我来说正合适
wengzuhong
驱动小牛
驱动小牛
  • 注册日期2004-07-16
  • 最后登录2014-10-22
  • 粉丝3
  • 关注1
  • 积分9分
  • 威望262点
  • 贡献值0点
  • 好评度219点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-07-04 01:05
楼上的,你是将代码加在close中吗??
我在close中加了,debug出现蓝屏
wengzuhong
驱动小牛
驱动小牛
  • 注册日期2004-07-16
  • 最后登录2014-10-22
  • 粉丝3
  • 关注1
  • 积分9分
  • 威望262点
  • 贡献值0点
  • 好评度219点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-07-04 01:07
内存映射文件的清除,是否能解决copy文件出现明文的问题
wengzuhong
驱动小牛
驱动小牛
  • 注册日期2004-07-16
  • 最后登录2014-10-22
  • 粉丝3
  • 关注1
  • 积分9分
  • 威望262点
  • 贡献值0点
  • 好评度219点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-07-04 12:14
顶上去
wengzuhong
驱动小牛
驱动小牛
  • 注册日期2004-07-16
  • 最后登录2014-10-22
  • 粉丝3
  • 关注1
  • 积分9分
  • 威望262点
  • 贡献值0点
  • 好评度219点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-07-05 00:06
还有谁做过这方面的测试啊???
yaolixing
驱动小牛
驱动小牛
  • 注册日期2006-06-27
  • 最后登录2010-07-15
  • 粉丝1
  • 关注0
  • 积分991分
  • 威望135点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-10-03 20:12
不会造成数据损坏。这段代码要放在cleanup()中.在close()中FileObject已经死去,你再调用它的指针指来指去,不蓝屏才怪
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
8楼#
发布于:2007-10-04 21:39
因为每个文件的cache只有一份,所以,明文是必然的!
即使你清掉下次读的时候又会被cache
人总在矛盾中徘徊。。。
isware
驱动牛犊
驱动牛犊
  • 注册日期2006-01-24
  • 最后登录2013-04-15
  • 粉丝0
  • 关注0
  • 积分385分
  • 威望79点
  • 贡献值0点
  • 好评度38点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-10-09 10:11
做了几个月,越到后来越觉得是在做一件出力不讨好的事!郁闷!
BITI_Ceasar
驱动牛犊
驱动牛犊
  • 注册日期2007-04-03
  • 最后登录2012-08-07
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望25点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2008-08-07 11:16
清缓存还是在create里清比较安全。只有被控制进程去清就可以
博观而约取、厚积而薄发
dreamsity
驱动小牛
驱动小牛
  • 注册日期2006-09-01
  • 最后登录2013-07-04
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望821点
  • 贡献值1点
  • 好评度68点
  • 原创分1分
  • 专家分0分
11楼#
发布于:2008-08-13 11:43
下面的访问序列应该是可以处理的
CreateFile
CreateFileMapping
MapViewOfFile
memcpy
UnmapViewOfFile
CloseHandle(Map)
CloseHandle(File)
这时候在关闭文件的时候,清内存映射有可能是成功的。
但也需要考虑多个进程引用同一个内存映射的问题。

但是如果出现这样的访问序列,该怎么处理?
CreateFile
CreateFileMapping
MapViewOfFile
CloseHandle(File)
memcpy
UnmapViewOfFile
CloseHandle(Map)
这时候在关闭文件的时候,清内存映射是绝对清不掉的。
是否需要在关闭进程的时候再清一次?
或者采用HOOK?
一切都是时间问题!
newfire@163.com
驱动牛犊
驱动牛犊
  • 注册日期2008-01-29
  • 最后登录2011-07-18
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望133点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2009-06-05 16:14
http://bbs.driverdevelop.com/htm_data/39/0703/100266.html
请问这短清缓存的代码在swapBuffers中那个函数中使用呀?
游客

返回顶部